export default class ExceptionLogger {
  /**
   *  @description 检测输入的 URL 地址 是否合法
   *  @param {String} url 输入框中输入的 URL 地址
   *  @returns URL是否合法
   */
  static isValidURL(url) {
    const urlPatterns = [/^((http|https):\/\/)?(localhost|(\d{1,3}\.){3}\d{1,3}|([a-zA-Z0-9-]+\.[a-zA-Z]{2,}))(:\d{1,5})?(\/[^\s]*)?$/, /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/, /^((http|https):\/\/)?((\d{1,3}\.){3}\d{1,3}(:\d{1,5})?)(\/[^\s]*)?$/, /^(((ht|f)tps?):\/\/)?([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+[a-z]{2,6}\/?/]
    return urlPatterns.some((pattern) => pattern.test(url))
  }

  /**
   * @description 处理 WMS 加载异常
   * @param {String} errorInfo
   * @returns
   */
  static wmsHandleException(errorInfo) {
    const defaultMessage = 'WMS加载出现未知错误,请与管理员联系'
    const networkMessage = '请求WMS能力文档失败,请检查网络连接或输入的 URL 是否正确'
    const invalidMessage = '请求能力文档失败,请检查输入地址或选择文件是否为WMS能力文档'
    // 请求400  404 或超时
    if (!errorInfo) return this.logException(networkMessage)
    // 请求成功，但返回的能力文档不符合WMS规范，找不到需要的信息
    if (errorInfo.message === "Cannot read properties of null (reading 'querySelector')") return this.logException(invalidMessage)
    this.logException(errorInfo.message || defaultMessage)
  }

  /**
   * @description 处理 WMTS 加载异常
   * @param {String} errorInfo
   * @returns
   */
  static wmtsHandleException(errorInfo) {
    const defaultMessage = 'WMTS加载出现未知错误,请与给管理员联系'
    const networkMessage = '请求WMTS能力文档失败,请检查网络连接或输入的 URL 是否正确'
    const invalidMessage = '请求WMTS能力文档失败,请检查输入地址或选择文件是否为WMTS能力文档'
    // 请求400  404 或超时
    if (!errorInfo) return this.logException(networkMessage)
    // 请求成功，但返回的能力文档不符合WMTS规范，找不到需要的信息
    const specificErrors = ["Cannot read properties of undefined (reading 'SupportedCRS')", "Cannot read properties of undefined (reading '0')"]
    if (specificErrors.includes(errorInfo.message)) return this.logException(invalidMessage)
    this.logException(errorInfo.message || defaultMessage)
  }

  /**
   * @description 输出错误信息至控制台与消息提醒
   * @param {String} errorInfo
   * @returns
   */
  static logException(errorInfo) {
    const currentDateTime = new Date().toLocaleString()
    console.log(`${currentDateTime} - Error: ${errorInfo}`)
    return window.$message.error(`${currentDateTime} - ${errorInfo}`)
  }
}
